<?php
/**
 * 简单工厂模式
 * User: Yan
 * Date: 2018/7/5
 * Time: 11:28
 */

namespace Yan;
include_once 'Singleton.php';

class Factory
{
    /**
     * 工厂方法，可以使类的实例化过程不用对外暴露，
     * 假设我们有一个类在实例化时候参入参数，当我们后期需要改变类名或者参数的顺序、增加参数，就需要修改每一个new了该类的地方
     * 当我们使用工厂方法得到类的实例，则可以只修改工厂方法
     * @param string $key
     * @return mixed
     */
    public static function getClass($key)
    {
        switch ($key) {
            case 'Db':
                // 简单做法
                // return new Db();
                break;

            case 'Singleton':
                // 结合单例模式
                return Singleton::getInstance();
                break;

            case 'Db3':
                // 假设后期需要修改传参
                // return Singleton::getInstance('参数1', '参数2');
                break;

            default:
                break;
        }
    }
}
/*
$Singleton = Factory::getClass('Singleton');
var_dump($Singleton);
$Singleton2 = Factory::getClass('Singleton');
var_dump($Singleton2);
*/
// 输出结果 object(Yan\Singleton)#1 (0) { } object(Yan\Singleton)#1 (0) { }